import random
import matplotlib.pyplot as plt

def fonction(x):
    return x ** 2

def aire_monte_carlo_avec_plot(fonction, borne_gauche, borne_droite, nombre_points):
    points_sous = []
    points_sure = []

    for _ in range(nombre_points):
        x = random.uniform(borne_gauche, borne_droite)
        y = random.uniform(0, fonction(borne_droite))  # ici max f(1) = 1
        if y <= fonction(x):
            points_sous.append((x, y))
        else:
            points_sure.append((x, y))

    # Aire du rectangle
    aire_rectangle = (borne_droite - borne_gauche) * fonction(borne_droite)
    aire_estimee = (len(points_sous) / nombre_points) * aire_rectangle

    # Tracé graphique
    plt.figure(figsize=(8, 6))

    # Tracé de la courbe y = x^2
    x_vals = [i / 1000 for i in range(1001)]
    y_vals = [fonction(x) for x in x_vals]
    plt.plot(x_vals, y_vals, color='blue', label='y = x²')

    # Tracé des points
    if points_sous:
        x_sous, y_sous = zip(*points_sous)
        plt.scatter(x_sous, y_sous, color='green', s=1, label='Points sous la courbe')
    if points_sure:
        x_sure, y_sure = zip(*points_sure)
        plt.scatter(x_sure, y_sure, color='red', s=1, label='Points au-dessus')

    # Options du graphique
    plt.title(f"Estimation de l'aire sous y = x² entre 0 et 1\nAire estimée ≈ {aire_estimee:.5f}")
    plt.xlabel("x")
    plt.ylabel("y")
    plt.legend()
    plt.grid(True)
    plt.xlim(borne_gauche, borne_droite)
    plt.ylim(0, fonction(borne_droite))

    plt.show()
    return aire_estimee

# Paramètres
borne_gauche = 0
borne_droite = 1
nombre_points = 10000  # 10 000 points suffisent pour voir la forme

# Exécution
aire = aire_monte_carlo_avec_plot(fonction, borne_gauche, borne_droite, nombre_points)
print(f"Aire estimée sous la courbe : {aire}")